C++中的locale设置 (即系统区域设置) |
您所在的位置:网站首页 › locale 设置 › C++中的locale设置 (即系统区域设置) |
C++中的locale设置
参考: 区域设置和代码页C/C++程序中,locale(即系统区域设置,即国家或地区设置)将决定程序所使用的当前语言编码、日期格式、数字格式及其它与区域有关的设置,locale设置的正确与否将影响到程序中字符串处理(wchar_t如何输出、strftime()的格式等)。因此,对于每一个程序,都应该慎重处理locale设置。 C locale和C++ locale是独立的。C locale用setlocale(LC_CTYPE, “”)初始化, C++ locale用std::locale::global(std::locale(“”))初始化。这样就可以根据当前运行环境正确设置locale。 根据环境变量中设置编码信息使用第二个参数为”"的setlocale()调用会自动根据LC_ALL、LC_CTYPE和LANG环境变量的值设置合适的值。 [cpp] view plaincopy #include #include using std::locale; int main() { setlocale(LC_CTYPE, ""); // 使用当前locale,但numpunct使用缺省的,因此不会在输出数字时加上千位分隔符 locale::global(locale("").combine(locale::classic()));setlocale()的有效的locale串 setlocale()的有效的locale串在windows下可以用”.codepage”如”.936″来指定,linux下可以指定得更详细:”zh_CN.GB18030″。zh(语言,这里指中文)_CN(地区,这里指中国大陆).GB18030(该语言所使用的字符集)。可能有一个以上的国家/地区说某种特定的语言,例如,巴西和葡萄牙都说葡萄牙语。反之,一个国家/地区可能有一种以上的官方语言。例如,加拿大有两种官方语言:英语和法语。语言和地区两个因素组合才会确定一个字符集,即使用某个语言的某一地区会创建一个该地区的字符集来表示该语言的字符。 windows下不能直接指定“GB18030”,可能只能用“GBK”。 检测当前的语言环境是否使用了 UTF-8 编码先用setlocale()设置编码,再用nl_langinfo()进行检测 为检测当前语言环境是否使用了 UTF-8 编码。首先必须调用 setlocale(LC_CTYPE, “”) 函数,依据环境变量设置语言环境。nl_langinfo(CODESET) 函数也是由 locale charmap 命令调用,从而查找当前语言环境指定的编码名称。 [cpp] view plaincopy BOOL utf8_mode = FALSE; if(!strcmp(nl_langinfo(CODESET), "UTF-8") utf8_mode = TRUE;•直接查询环境变量 这项测试假设 UTF-8 语言环境名称中有值“UTF-8”,但实际情况并不总是如此,所以应该使用 nl_langinfo() 方法。 char *s; BOOL utf8_mode = FALSE; if ((s = getenv("LC_ALL")) || (s = getenv("LC_CTYPE")) || (s = getenv ("LANG"))) { if (strstr(s, "UTF-8")) utf8_mode = TRUE; }附加: 区域设置(即locale)就成为语言、国家/地区和代码页的唯一组合。可以通过调用setlocale 函数在运行时更改区域设置和代码页设置。 参考: locale C++ 百度 ======================================= C++之国际化(2) --- locale 分类: C++ 2014-03-03 13:30 487人阅读 评论(0) 收藏 举报转载自:http://hi.baidu.com/nicker2010/item/8cc13bce77f11b3899b498eb
解决国际化问题,通常是通过locale环境,它被用来封装国家(地域)和文化之间的转换行为。 一个locale就是一个参数和函数的集合。根据X/Open公约,环境变量LANG用来确定当时的locale 不同的浮点数、日期、货币格式等则根据这个locale确定。 确定一个locale,需要采用以下字符串格式: language[_area[.code]] language表示语言,例如英语或者德语 _area表示该语言所处的地域、国家或者文化。用它可以在相同语言的不同国家之间实行转换 code定义字符编码方案,其重要性主要体现在亚洲,因为在那相同的字符集有不同的编码方案,如汉字的BIG5和GB 下面列出了典型的语言名称: c Default: ANSI-C conventions (English, 7 bit) de_DE German in Germany de_DE. 88591 German in Germany with ISO Latin-1 encoding de_AT German in Austria de_CH German in Switzerland en_US English in the United States en_GB English in Great Britain en_AU English in Australia en_CA English in Canada fr_FR French in France fr_CH French in Switzerland fr_CA French in Canada ja_JP.jis Japanese in Japan with Japanese Industrial Standard (JIT) encoding ja_JP.sjis Japanese in Japan with Shift JIS encoding ja_JP.ujis Japanese in Japan with UNIXized JIS encoding ja_JP.EUC Japanese in Japan with Extended UNIX Code encoding ko_KR Korean in Korea zh_CN Chinese in China zh_TW Chinese in Taiwan lt_LN.bit7 ISO Latin, 7 bit lt_LN.bit8 ISO Latin, 8 bit POSIX POSIX conventions (English, 7 bit) 但它们尚未标准化。 对程序而言,这些名称是否标准化无关紧要, 因为locale的信息是由使用者根据以某种形式提供的。 普遍的做法是:程序只需读取环境变量或者类似的数据库,判断可用的locales, 然后便可以将“选择正确locale名称"的任务交给使用者。 C程序可以使用函数setlocale()来设定一个locale。 改变locale会对isupper()和toupper()之类的字符函数以及printf()之类的I/O函数产生影响 但C的解决方案有很多的限制。 C++的标准中,locale则被泛化,设计得更有弹性 locale使用示例: cin.imbue(locale::classic()); ///使用经典的C的locale从标准流中读取数据 cout.imbue(local("de_DE")); ///imbue函数用来安装locale,///德国的小数点为逗号(',') double value; while(cin>>value) cout public: typedef int category; class facet; class id; class _Impl; friend class facet; friend class _Impl; /**has_facet和use_facet是两个重要的友元函数 has_facet确定locale中是否有类型为_Facet的facet use_facet返回locale中使用的类型为_Facet的facet对象的引用 */ template friend bool has_facet(const locale&) throw(); template friend const _Facet& use_facet(const locale&); template friend struct __use_cache; /**locale中使用的facet*/ static const category none = 0; static const category ctype = 1L 12 cerr |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |